package ink.tiptop.learn.convert.test;

import org.mapstruct.*;

/**
 * @author zjf
 * @date 2020-08-15 18:07
 * 控制“null”参数的映射结果
 * <p>
 * 1.当映射方法的source参数等于null时，MapStruct提供对要创建的对象的控制。默认情况下，将返回null。
 * <p>
 * 2.通过@BeanMapping，@IterableMapping，@MapMapping,@Mapper,@MappingConfig
 *  上的全局指定nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT，
 *  可以更改映射结果以返回空的默认值。这意味着：
 * <p>
 *  Bean映射：将返回一个“empty”目标bean，除常量和表达式外，它们将在存在时填充。
 *  基本数据类型：将返回基本数据类型的默认值，例如boolean类型的默认值时false，int类型的默认值时0。
 *  集合/数组（Iterables/Arrays）：将返回一个空（empty）的iterable。
 *  Maps：将返回一个空（empty）的Map。
 *  该策略以等级方式运作。在映射方法级别上设置
 *  nullValueMappingStrategy将覆盖@Mapper#nullValueMappingStrategy，
 *  而@Mapper#nullValueMappingStrategy将覆盖@MappingConfig#nullValueMappingStrategy。
 *  ----------------------------------------------------------------------
 *  控制bean映射中“null”属性的检查结果
 *   MapStruct控制何时生成空检查。默认情况下（nullValueCheckStrategy = NullValueMappingStrategy.ON_IMPLICIT_CONVERSION）将为以下内容生成空检查：
 *      当目标是基本数据类型且源不是的时候，将源值直接设置为目标值。
 *      应用类型转换，然后：
 *          在目标上调用setter方法。
 *          调用另一个类型转换，然后调用目标上的setter方法。
 *          调用映射方法，然后调用目标上的setter方法。
 *      首先在源属性上调用映射方法不受null检查的保护。因此，生成的映射方法将在对源属性执行映射之前进行空检查。手写的映射方法必须处理空值检查。他们有可能将“meaning”添加到null。例如：将null映射到默认值。
 *      除非在源bean上定义了源存在检查器，否则当源不是基本数据类型时，nullValueCheckStrategy = NullValueMappingStrategy.ALWAYS选项将始终包含空检查。
 *      该策略以等级方式运作。@Mapper#nullValueMappingStrategy将覆盖@MappingConfig#nullValueMappingStrategy。
 */
@Mapper(
//        nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL,  // 对null值的映射,这是默认的null处理方式
        nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT, // 对null值的映射,返回空对象,并非Null
        nullValueCheckStrategy = NullValueCheckStrategy.ON_IMPLICIT_CONVERSION // 何时生成NULL检查,这是默认值
)
public interface A_NullConvert {

//    @Mappings({
//            @Mapping(target = "name",source = "name",
//                    // 这个是默认值,设置null
////                    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL)
//                    // 这个是非默认值, 设置默认值,比如空map 空list,会覆盖@Mapper上定义的null策略
//                    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)
//    })
//    Apple convert(FruitDto dto);
}